home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
games
/
hitton
/
htn_src.lzh
/
HTN_SRC
/
HTN_GAME.C
< prev
next >
Wrap
Text File
|
2000-07-03
|
16KB
|
610 lines
/* 『ひっとん』 ver.1.00 ゲーム (HTN_GAME.C) 2000 TAU Software */
# include "HTN_DEF.H"
/*** 1-line HITTON 用マクロ ***/
# define DEL_NUM 3 /* 消滅する最低ブロック数(2以上) */
# define MAX_TOP 16 /* 最大ブロック積数 */
# define MAX_LV 99 /* 最高レベル */
# define MAX_SCR 999999 /* 最大点数 */
# define MAX_BLK 9999 /* 最大ブロック数 */
# define RET_WAIT 1450 /* キー押されなかった時のタイトル帰還時間 */
# define BLK_DEL_WAIT 3 /* ブロック消滅ウェイト */
# define OVER_WAIT 600 /* ゲームオーバー時ウェイト */
# define OVER_DEL_WAIT 20 /* ゲームオーバー時ブロック削除ウェイト */
# define NEXT_BLK_WAIT 60 /* 次ブロック出現ウェイト */
# define NEXT_REN_WAIT 20 /* 次連鎖ウェイト */
# define NAME_WAIT 100 /* 名前入力完了後ウェイト */
# define FIXED_BLOCK(pl,xp) SET_SP_BLOCK((pl)*32+(xp)*2+2,248-(xp)*16,pl*122+92,*(m0+(xp)),*(mc+(xp)))
/* ブロック描画(固定) <sprite> pl:プレイヤー番号 xp:位置番号 */
# define PRINT_LEVEL(pl,lv) PRINT_SPNUM( 98+(pl)*2, 78,18+(pl)*122,(lv),1,2,12+(pl)*2)
# define PRINT_SCORE(pl,sc) PRINT_SPNUM(102+(pl)*6,187,18+(pl)*122,(sc),1,6,13-(pl)*5)
# define PRINT_BLKNUM(pl,bkn) PRINT_SPNUM(114+(pl)*4,205,42+(pl)*122,(bkn),1,4,13-(pl)*5)
/* レベル・スコア・ブロック数 の表示 */
int HTN_GAME0()
{
int i,j,k,z,ck0; /* 雑用 */
int jd,jd2,rt=0; /* ジョイ入力データ、返り値用 */
int ret_tm,ret_ck=0; /* タイトル自動帰還管理用 */
int inp_turn=0; /* 名前入力排他用 */
int turn; /* プレイヤー番号 */
RECS *rec0; /* 順位並び変え用記録データポインタ */
int sc[2],bkn[2],lv[2]; /* スコア、ブロック数、レベル */
int spd[2],hspd[2],sdct[2]; /* 落下スピード、高速落下スピード、スピードアップ用 */
int tp[2],blk[2],n_blk[2]; /* 一番左のブロック位置、落下ブロック種類、次ブロック種類 */
int lkn[2],nlf[2],nrg[2]; /* 消滅ブロック数、消滅ブロック左位置、消滅ブロック右位置 */
int x0[2],nx[2],zz[2]; /* 落下ブロック位置、ブロックを置いた位置、雑用 */
int ct[2],rct[2],lct[2]; /* カウント用、連鎖回数、レベルアップ用カウンタ */
int map[2][18],*m0; /* 仮想マップ(ブロック種類) */
int mapc[2][18],*mc; /* 仮想マップ(連結パターン) */
int tm[2]; /* ウェイト用時間保存 */
int rn[2],blkd[2]; /* ランキング(順位)、出現ブロック種類数 */
int nmp[2]; /* 名前入力用(何文字目) */
char name[2][5]={"アアアア","アアアア"},n2[2]=" "; /* 名前入力用 */
int vdsp,pvdsp,vdsp_ck; /* 垂直帰線期間チェック用 */
int stat[2]; /* ステータス */
SCROLL2(0,0,0); SCROLL2(1,0,0);
PRINT_LEVEL(0,1);
PRINT_SCORE(0,0);
PRINT_BLKNUM(0,0);
PRINT_LEVEL(1,1);
PRINT_SCORE(1,0);
PRINT_BLKNUM(1,0);
VDISP0();
VPAGE2(0x6F);
SP_ON();
(**map)=(*(*map+17))=-1;
(**(map+1))=(*(*(map+1)+17))=-1;
turn=1;
*stat=*(stat+1)=-99;
vdsp=(B_BPEEK((unsigned char *)0xE88001) & 0x10);
jd=JOY0(turn);
ret_tm=ONTIME();
while(1){
turn=1-turn;
jd=JOY0(turn);
if(jd & 0x4000){
PLAY_MUS(4);
*tm=D_TIME(*tm); *(tm+1)=D_TIME(*(tm+1));
ret_tm=D_TIME(ret_tm);
VDISP0();
VPAGE2(0x2F);
B_WPOKE((unsigned short *)0xE80014,256); /* テキストスクロールX */
jd|=PAUSE();
B_WPOKE((unsigned short *)0xE80014,0); /* テキストスクロールX */
VDISP0();
VPAGE2(0x6F);
PLAY_MUS(3);
*tm=D_TIME(*tm); *(tm+1)=D_TIME(*(tm+1));
ret_tm=D_TIME(ret_tm);
}
if(jd & 0x8000){ rt=-1; break; }
if(jd & 0x2000){ rt=1; break; } /* タイトル帰還 DEBUG用 */
if(*stat==-97 && *(stat+1)==-97){
if(ret_ck == 0) ret_tm=ONTIME();
if(D_TIME(ret_tm) > RET_WAIT){ rt=1; break; }
ret_ck=1;
} else ret_ck=0;
m0=*(map+turn);
mc=*(mapc+turn);
if(turn == 0){
pvdsp=vdsp;
vdsp=(B_BPEEK((unsigned char *)0xE88001)&0x10);
vdsp_ck=(pvdsp&~vdsp);
}
switch(*(stat+turn)){
case 0: /* */
*(x0+turn)+=*(spd+turn);
ck0=0;
if(jd&8 && *(hspd+turn)>*(spd+turn)){
*(x0+turn)+=*(hspd+turn);
ck0=1;
}
if(*(x0+turn) > 232){ /* 落下ブロック右端まで来た時 */
*(nx+turn)=1;
*(stat+turn)=52;
break;
}
if(((248-*(x0+turn))/16) < *(nx+turn)){ /* 落下ブロック、ブロック境に来た時 */
(*(nx+turn))--;
if(*(nx+turn) < *(tp+turn)){ /* ?落下ブロック、積みブロックに到達した時 */
if(!(jd&32)){
(*(nx+turn))++;
*(stat+turn)=52;
break;
}
if(*(sc+turn)<MAX_SCR && ck0!=0){
(*(sc+turn))++;
(*(lct+turn))++;
PRINT_SCORE(turn,*(sc+turn)); /* 点数表示 */
}
if(*(m0+*(nx+turn)+2) == *(m0+*(nx+turn))){
*(mc+*(nx+turn))=2;
*(mc+*(nx+turn)+2)=(*(mc+*(nx+turn)+2)/2)*2+1;
FIXED_BLOCK(turn,*(nx+turn)+2);
} else *(mc+*(nx+turn))=0;
if(*(m0+*(nx+turn)-1) != -1){
*(mc+*(nx+turn)-1)=*(mc+*(nx+turn)-1)%2;
FIXED_BLOCK(turn,*(nx+turn)-1);
}
}
if(*(nx+turn) <= *(tp+turn)){
*(m0+*(nx+turn)+1)=*(m0+*(nx+turn));
*(mc+*(nx+turn)+1)=*(mc+*(nx+turn));
*(m0+*(nx+turn))=*(blk+turn);
*(mc+*(nx+turn))=0;
}
if(*(nx+turn) < *(tp+turn)){
FIXED_BLOCK(turn,*(nx+turn)+1);
SP_REGST0(turn*32+*(nx+turn)*2+2,0,0,0);
SP_REGST0(turn*32+*(nx+turn)*2+3,0,0,0);
}
}
*(stat+turn)=50;
break;
case 2: /* 消滅判定 */
ck0=0;
if(*(m0+*(nlf+turn)+1) == *(blk+turn)) (*(nlf+turn))++; else ck0++;
if(*(m0+*(nrg+turn)-1) == *(blk+turn)) (*(nrg+turn))--; else ck0++;
if(ck0 == 2){
*(lkn+turn)=*(nlf+turn)-*(nrg+turn);
if(*(lkn+turn) > DEL_NUM-2+(*(blk+turn)==5)){
*(ct+turn)=0;
PLAY_MUS(6);
*(tm+turn)=ONTIME();
*(stat+turn)=53;
} else{
PLAY_MUS(7);
*(tm+turn)=ONTIME();
*(stat+turn)=-1;
}
}
break;
case 3: /* ブロック消滅よる落下準備 */
if(*(nlf+turn) == *(tp+turn)-1){
*(tp+turn)-=(*(lkn+turn)+1);
*(m0+*(tp+turn))=-1;
*(tm+turn)=ONTIME();
*(stat+turn)=-1;
break;
}
*(ct+turn)=1;
*(stat+turn)=4;
break;
case 4:
if(*(ct+turn) < 17){
if(*(ct+turn)==1 && vdsp_ck!=0) break;
i=*(ct+turn);
if(i<*(tp+turn) && i>*(nlf+turn)){
SET_BG_BLOCK(turn,i,*(m0+i),*(mc+i));
} else SET_BG_BLOCK(turn,i,-1,0);
(*(ct+turn))++;
break;
}
VDISP0();
BGSCRLST(0x80000000+turn,256,164-turn*122);
BGCTRLST(turn,-1,1);
for(i=*(nlf+turn)+1;i<*(tp+turn);i++){
SP_REGST0(turn*32+i*2+2,0,0,0);
SP_REGST0(turn*32+i*2+3,0,0,0);
}
*(ct+turn)=*(lkn+turn)*4+4;
*(zz+turn)=256;
*(tm+turn)=ONTIME();
*(stat+turn)=55;
break;
case 50: /* 落下ブロック移動 */
if(vdsp_ck){
SET_SP_BLOCK(turn*2,*(x0+turn),turn*122+92,*(blk+turn),0);
*(stat+turn)=0;
}
break;
case 52: if(vdsp_ck){
SP_REGST0(turn*2,0,0,0); /* 落下ブロック消去 */
SP_REGST0(turn*2+1,0,0,0);
*(m0+*(nx+turn))=*(blk+turn);
*(mc+*(nx+turn))=0;
if(*(m0+*(nx+turn)+1) == *(blk+turn)){
*(mc+*(nx+turn))=*(mc+*(nx+turn))+2;
*(mc+*(nx+turn)+1)=(*(mc+*(nx+turn)+1)/2)*2+1;
FIXED_BLOCK(turn,*(nx+turn)+1);
}
if(*(m0+*(nx+turn)-1) == *(blk+turn)){
*(mc+*(nx+turn))=*(mc+*(nx+turn))+1;
*(mc+*(nx+turn)-1)=*(mc+*(nx+turn)-1)%2+2;
FIXED_BLOCK(turn,*(nx+turn)-1);
}
FIXED_BLOCK(turn,*(nx+turn));
*(rct+turn)=0;
(*(tp+turn))++;
*(nlf+turn)=*(nx+turn);
*(nrg+turn)=*(nx+turn);
*(stat+turn)=2;
}
break;
case 53: /* 消滅アニメーション */
if(D_TIME(*(tm+turn)) <= (*(ct+turn))*BLK_DEL_WAIT) break;
if(vdsp_ck){
if(*(ct+turn) < 6){
for(i=*(nrg+turn);i<=*(nlf+turn);i++){
SP_REGST0(turn*32+i*2+2,248-i*16,turn*122+96,*(blk+turn)*256+305+*(ct+turn));
if(*(ct+turn) == 0){
SP_REGST0(turn*32+i*2+2,0,0,0);
SP_REGST0(turn*32+i*2+3,0,0,0);
}
}
(*(ct+turn))++;
} else{
for(i=*(nrg+turn);i<=*(nlf+turn);i++) SP_REGST0(turn*32+i*2+2,0,0,0);
(*(rct+turn))++;
k=*(rct+turn);
z=*(lkn+turn)+1;
j=(k*k*k*k)*(z*(z-1));
*(sc+turn)+=(((k*k*2)+(*(lv+turn)/4-1))*(z-2)*(z*10));
*(bkn+turn)+=z;
if(*(sc+turn) > MAX_SCR) *(sc+turn)=MAX_SCR;
if(*(bkn+turn) > MAX_BLK) *(bkn+turn)=MAX_BLK;
if(*(lv+turn) < MAX_LV){
*(lct+turn)+=((j/10)+100);
if(*(lct+turn)>999){
(*(lv+turn))++;
PLAY_MUS(5);
PRINT_LEVEL(turn,*(lv+turn)); /* レベル表示 */
*(lct+turn)=0;
*(spd+turn)=(int)(sqrt(*(lv+turn))+1.5);
if(*(spd+turn)>8) *(spd+turn)=8; else if(*(spd+turn)<2) *(spd+turn)=2;
*(hspd+turn)=*(spd+turn)+4;
*(sdct+turn)=1000/(int)(*(lv+turn)/20+2);
*(blkd+turn)=4+(*(lv+turn)>1)+(*(lv+turn)>18)-(*(lv+turn)>36 && ((*(lv+turn))&1)==0 );
} else{
if(*(lct+turn) >= *(sdct+turn)){
(*(sdct+turn))+=(1000/(int)(*(lv+turn)/20+2));
(*(spd+turn))++;
if(*(hspd+turn) < 16) (*(hspd+turn))++;
}
}
}
PRINT_SCORE(turn,*(sc+turn)); /* 点数表示 */
PRINT_BLKNUM(turn,*(bkn+turn)); /* 累積消滅ブロック数表示 */
*(ct+turn)=*(nlf+turn)+1;
*(stat+turn)=3;
}
}
break;
case 55: /* ブロック消滅による落下 */
if(vdsp_ck){
BGSCRLST(0x80000000+turn,*(zz+turn),164-turn*122);
if(*(ct+turn) > 0){
(*(ct+turn))--;
*(zz+turn)-=4;
} else{
*(ct+turn)=0;
*(tm+turn)=ONTIME();
*(stat+turn)=56;
}
}
break;
case 56:/* ブロック再描画 */
if(vdsp_ck){
if(*(ct+turn) < *(tp+turn)-*(nlf+turn)-1){
z=*(nrg+turn)+*(ct+turn);
*(m0+z)=*(m0+*(ct+turn)+*(nlf+turn)+1);
*(mc+z)=*(mc+*(ct+turn)+*(nlf+turn)+1);
if(*(m0+z-1) == *(m0+z)){
*(mc+z)=(*(mc+z)/2)*2+1;
*(mc+z-1)=*(mc+z-1)%2+2;
FIXED_BLOCK(turn,z-1);
}
FIXED_BLOCK(turn,z);
(*(ct+turn))++;
} else{
*(tp+turn)-=(*(lkn+turn)+1);
*(m0+*(tp+turn))=-1;
BGCTRLST(turn,-1,0);
if(*(m0+*(nrg+turn)-1) == *(m0+*(nrg+turn))
&& *(m0+*(nrg+turn))!=-1)
*(stat+turn)=58; else{ *(tm+turn)=ONTIME(); *(stat+turn)=-1; }
}
}
break;
case 58: /* 連鎖判定準備 */
if(D_TIME(*(tm+turn)) > NEXT_REN_WAIT){
*(nlf+turn)=*(nrg+turn);
*(blk+turn)=*(m0+*(nrg+turn));
*(stat+turn)=2;
}
break;
case -1: /* 次ブロック出現待 */
if(*(tp+turn) > MAX_TOP){ *(stat+turn)=-19; break; }
if(D_TIME(*(tm+turn)) > NEXT_BLK_WAIT){
*(x0+turn)=-17;
*(nx+turn)=17;
*(blk+turn)=*(n_blk+turn);
z=*(blkd+turn);
if(z==6 && *(tp+turn)>12) z=5;
*(n_blk+turn)=RND0()*z;
SET_SP_BLOCK(turn*2+122,205,turn*122+64,*(n_blk+turn),0);
*(stat+turn)=0;
}
break;
case -17: if(vdsp_ck==0) break;
if(jd&32){ /* ゲームオーバークリア */
VDISP0();
TXFILL0(38,turn*122+94,180,18,15,0);
*(stat+turn)=-99;
}
break;
case -19: /* ゲームオーバー */
if(vdsp_ck==0) break;
PRINT_MES(38,turn*122+94,"ゲーム オーバー",5-turn*4);
PLAY_MUS(10);
*(ct+turn)=1;
*(tm+turn)=ONTIME();
*(stat+turn)=-20;
break;
case -20: /* ゲームオーバー:ブロックの消滅 */
if(D_TIME(*(tm+turn)) <= OVER_DEL_WAIT+(*(ct+turn))*BLK_DEL_WAIT) break;
if(vdsp_ck==0) break;
if(jd&32){
for(i=0;i<32;i++) SP_REGST0(turn*32+i+4,0,0,0);
*(ct+turn)=MAX_TOP+7;
*(tm+turn)=ONTIME()-OVER_WAIT;
}
if(*(ct+turn) > MAX_TOP+7){
if(D_TIME(*(tm+turn)) > OVER_WAIT){
TXFILL0(38,turn*122+94,180,18,15,0);
*(stat+turn)=-21;
}
break;
}
if(*(ct+turn) <= MAX_TOP)
SP_REGST0(turn*32+*(ct+turn)*2+3,0,0,0);
for(i=0;i>=-6;i--){
z=*(ct+turn)+i;
if(z>=1 && z<=MAX_TOP)
if(i > -6)
SP_REGST0(turn*32+z*2+2,248-z*16,turn*122+96,*(m0-i)*256+305-i);
else SP_REGST0(turn*32+z*2+2,0,0,0);
}
(*(ct+turn))++;
break;
case -21:
if(inp_turn != 0){
if(inp_turn == 1) PRINT_MES(38,turn*122+94,"チョット マッテネ!",4);
inp_turn=2;
break;
}
VDISP0();
TXFILL0(38,turn*122+94,180,18,15,0);
for(i=0;i<5;i++){
rec0=RECS_DATA(i,NULL);
if(*(sc+turn) > rec0->score) break;
}
*(rn+turn)=i;
if(i < 5){
PLAY_MUS(11);
PRINT_MES(36,turn*122+94,"ベスト",2+turn);
PRINT_TXNUM(110,turn*122+95,i+1,1,1,2+turn);
PRINT_MES(124,turn*122+94,"!",2+turn);
*(nmp+turn)=0;
PRINT_MES(148,turn*122+94,*(name+turn),5-turn*4);
*n2=**(name+turn);
PRINT_MES(148,turn*122+94,n2,turn+2);
inp_turn=1;
JOYINP1(turn);
*(nmp+turn)=0;
*(stat+turn)=-22;
} else *(stat+turn)=-99;
break;
case -22: /* ベストレコード入力 */
/*if(vdsp_ck==0) break;*/
if(*(nmp+turn) >= 4){
PLAY_MUS(8);
PRINT_MES(148,turn*122+94,*(name+turn),7-turn);
for(i=4;i>*(rn+turn);i--)
RECS_DATA(i,RECS_DATA(i-1,NULL));
rec0=RECS_DATA(*(rn+turn),NULL);
strcpy(rec0->name,*(name+turn));
(rec0->score)=*(sc+turn);
(rec0->block)=*(bkn+turn);
(rec0->level)=*(lv+turn);
WRITE_REC();
inp_turn=0;
*(tm+turn)=ONTIME();
*(stat+turn)=-23;
} else{
if(jd & 0x1000){
inp_turn=0;
TXFILL0(2,turn*122+94,252,18,15,0);
*(stat+turn)=-99;
break;
}
jd=JOYINP1(turn);
z=*(nmp+turn);
i=0; ck0=-1;
if(jd&15){
ck0=INP_NAME(*(*(name+turn)+z),jd);
if(ck0!=-1) *(*(name+turn)+z)=(char)ck0;
} else{
i=(((jd&32)!=0)-((jd&64)!=0));
if(z+i<0) i=0;
if(i){
PLAY_MUS(9);
*n2=*(*(name+turn)+z);
PRINT_MES(z*18+148,turn*122+94,n2,5-turn*4);
z+=i;
*(nmp+turn)=z;
}
}
if((i!=0 || ck0!=-1) && z<4){
*n2=*(*(name+turn)+z);
PRINT_MES(z*18+148,turn*122+94,n2,turn+2);
}
}
break;
case -23: /* 名前入力後ウェイト */
if(D_TIME(*(tm+turn)) <= NAME_WAIT) break;
if(vdsp_ck==0) break;
TXFILL0(2,turn*122+94,252,18,15,0);
*(stat+turn)=-99;
break;
case -97: /* ゲーム開始! */
if(jd&32){
PLAY_MUS(8);
if(vdsp_ck==0) break;
TXFILL0(38,turn*122+94,180,18,15,0);
*(tm+turn)=ONTIME();
*(stat+turn)=-1;
}
break;
case -98: /* 新規ゲーム開始待ち */
if(!(jd&32)) (*(stat+turn))++;
break;
case -99: /* 新規ゲームパラメータ設定 */
if(vdsp_ck==0) break;
PRINT_MES(38,turn*122+94,"ボタンヲオシテネ!",7-turn);
for(i=0;i<32;i++) SP_REGST0(turn*32+i+4,0,0,0);
PRINT_LEVEL(turn,1);
PRINT_SCORE(turn,0);
PRINT_BLKNUM(turn,0);
*(lv+turn)=1;
*(sc+turn)=0;
*(bkn+turn)=0;
*(lct+turn)=0;
*(n_blk+turn)=RND0()*4;
*(spd+turn)=2;
*(hspd+turn)=6;
*(sdct+turn)=500;
*(blkd+turn)=4;
VDISP0();
SET_SP_BLOCK(turn*2+122,205,turn*122+64,*(n_blk+turn),0);
*(tp+turn)=1;
*(m0+*(tp+turn))=-1;
*(stat+turn)=-98;
break;
}
}
VDISP0();
VPAGE2(0);
APAGE(0);
SP_OFF();
TXFILL0(0,0,256,256,15,0);
for(i=0;i<128;i++) SP_REGST0(i,0,0,0);
return rt;
}